From 03c29e1123594581c15288351f713b7d6571aede Mon Sep 17 00:00:00 2001 From: Anders Carlsson Date: Tue, 21 Mar 2006 09:36:46 +0000 Subject: [PATCH] Implement gdk_window_scroll. 2006-03-21 Anders Carlsson * gdk/quartz/gdkgeometry-quartz.c: (gdk_window_scroll): Implement gdk_window_scroll. --- ChangeLog | 6 +++++ ChangeLog.pre-2-10 | 6 +++++ gdk/quartz/gdkgeometry-quartz.c | 48 ++++++++++++++++++++++++++++++++- 3 files changed, 59 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 69fda700af..f8e0920b8b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2006-03-21 Anders Carlsson + + * gdk/quartz/gdkgeometry-quartz.c: + (gdk_window_scroll): + Implement gdk_window_scroll. + 2006-03-21 Anders Carlsson * gdk/quartz/GdkQuartzWindow.c: diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 69fda700af..f8e0920b8b 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,9 @@ +2006-03-21 Anders Carlsson + + * gdk/quartz/gdkgeometry-quartz.c: + (gdk_window_scroll): + Implement gdk_window_scroll. + 2006-03-21 Anders Carlsson * gdk/quartz/GdkQuartzWindow.c: diff --git a/gdk/quartz/gdkgeometry-quartz.c b/gdk/quartz/gdkgeometry-quartz.c index b7ad4c95b8..379f241192 100644 --- a/gdk/quartz/gdkgeometry-quartz.c +++ b/gdk/quartz/gdkgeometry-quartz.c @@ -27,8 +27,54 @@ gdk_window_scroll (GdkWindow *window, gint dx, gint dy) { + NSRect visible_nsrect; + GdkRectangle visible_rect, scrolled_rect; + GdkRegion *visible_region, *scrolled_region; + GdkRectangle *rects; + gint n_rects, i; + GdkWindowObject *private = GDK_WINDOW_OBJECT (window); + GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl); + GList *list; + g_return_if_fail (GDK_IS_WINDOW (window)); + + visible_nsrect = [impl->view visibleRect]; + + visible_rect.x = visible_nsrect.origin.x; + visible_rect.y = visible_nsrect.origin.y; + visible_rect.width = visible_nsrect.size.width; + visible_rect.height = visible_nsrect.size.height; + + scrolled_rect = visible_rect; + scrolled_rect.x += dx; + scrolled_rect.y += dy; + + gdk_rectangle_intersect (&visible_rect, &scrolled_rect, &scrolled_rect); + + visible_region = gdk_region_rectangle (&visible_rect); + scrolled_region = gdk_region_rectangle (&scrolled_rect); + + gdk_region_subtract (visible_region, scrolled_region); + + [impl->view scrollRect:[impl->view bounds] by:NSMakeSize(dx, dy)]; + + gdk_region_get_rectangles (visible_region, &rects, &n_rects); + for (i = 0; i < n_rects; i++) + [impl->view setNeedsDisplayInRect:NSMakeRect (rects[i].x, rects[i].y, rects[i].width, rects[i].height)]; - /* FIXME: Implement */ + g_free (rects); + + gdk_region_destroy (visible_region); + gdk_region_destroy (scrolled_region); + + /* Move child windows */ + for (list = private->children; list; list = list->next) + { + GdkWindowObject *child = GDK_WINDOW_OBJECT (list->data); + + gdk_window_move (list->data, + child->x + dx, + child->y + dy); + } } -- 2.30.2